import axios, { type AxiosInstance, type AxiosResponse, type InternalAxiosRequestConfig } from 'axios'
import NProgress from 'nprogress'
import 'nprogress/nprogress.css'

// 配置NProgress
NProgress.configure({
    showSpinner: false,
    minimum: 0.2,
    speed: 500
})

// 创建axios实例
const service: AxiosInstance = axios.create({
    baseURL: import.meta.env.VITE_API_BASE_URL || '/api',
    timeout: 10000,
    headers: {
        'Content-Type': 'application/json;charset=UTF-8'
    }
})

// 请求拦截器
service.interceptors.request.use(
    (config: InternalAxiosRequestConfig) => {
        // 开始进度条
        NProgress.start()
        
        // 可以在这里添加token等认证信息
        const token = localStorage.getItem('token')
        if (token && config.headers) {
            config.headers.Authorization = `Bearer ${token}`
        }
        
        return config
    },
    (error) => {
        NProgress.done()
        return Promise.reject(error)
    }
)

// 响应拦截器
service.interceptors.response.use(
    (response: AxiosResponse) => {
        // 结束进度条
        NProgress.done()
        
        // 统一处理响应数据
        const { code, data, message } = response.data
        
        if (code === 200) {
            return data
        } else {
            // 处理业务错误
            console.error('API Error:', message)
            return Promise.reject(new Error(message || '请求失败'))
        }
    },
    (error) => {
        NProgress.done()
        
        // 处理HTTP错误
        let message = '网络错误'
        if (error.response) {
            switch (error.response.status) {
                case 401:
                    message = '未授权，请重新登录'
                    // 可以在这里处理登录跳转
                    break
                case 403:
                    message = '拒绝访问'
                    break
                case 404:
                    message = '请求地址出错'
                    break
                case 408:
                    message = '请求超时'
                    break
                case 500:
                    message = '服务器内部错误'
                    break
                case 501:
                    message = '服务未实现'
                    break
                case 502:
                    message = '网关错误'
                    break
                case 503:
                    message = '服务不可用'
                    break
                case 504:
                    message = '网关超时'
                    break
                case 505:
                    message = 'HTTP版本不受支持'
                    break
                default:
                    message = `连接错误${error.response.status}`
            }
        } else if (error.request) {
            message = '网络连接异常'
        }
        
        console.error('Request Error:', message)
        return Promise.reject(error)
    }
)

export default service